package edu.tfh.s2.ehkbot.inventar;

import java.util.Vector;

import edu.tfh.s2.ehkbot.inventar.Regalfach.Belegung;
import edu.tfh.s2.ehkbot.steuerung.Position;
import edu.tfh.s2.ehkbot.steuerung.Positionierbar;

/**
 * WarenboxRegal bildet ein Warenbox Regal ab.
 * 
 * @author s2zehn
 */
public class WarenboxRegal extends Positionierbar {
	/**
	 * Wird geworfen wenn keine leere Box gefunden wurde.
	 */
	public class KeineLeereBox extends java.lang.Exception {
		private static final long serialVersionUID = 1L;
	}

	/**
	 * Wird geworfen wenn kein freies Fach gefunden wurde.
	 */
	public class KeinFreiesFach extends java.lang.Exception {
		private static final long serialVersionUID = 1L;
	}

	private static final long serialVersionUID = 6428046290520622570L;

	private Vector<Regalfach> faecher;

	/**
	 * Konstruktor für WarenboxRegal.
	 * 
	 * @param regalfaecher
	 *            Die Anzahl der leeren Fächer.
	 * @param position
	 *            Die Position des Regalfaches.
	 */
	public WarenboxRegal(int regalfaecher, Position position) {
		super(position);
		this.faecher = new Vector<Regalfach>(regalfaecher);
		for (int i = 0; i < regalfaecher; ++i) {
			faecher.add(new Regalfach());
		}
	}

	/**
	 * Liefert alle Regalfaecher.
	 * 
	 * @return Die Regalfaecher.
	 */
	public Vector<Regalfach> getRegalfaecher() {
		return faecher;
	}

	/**
	 * Verbindet ein Regalfach mit einer Warenbox.
	 * 
	 * @param index
	 *            Der Index Des Regalfaches.
	 * @param warenbox
	 *            Die Warenbox.
	 * @param position
	 *            Die Position des Regalfaches.
	 */
	public void putWarenbox(int index, Warenbox warenbox, Position position) {
		faecher.set(index, new Regalfach(warenbox, position));
	}

	/**
	 * Sucht ein leeres Regalfach.
	 * 
	 * @return Das leere Fach.
	 * @throws KeinFreiesFach
	 *             Wenn kein leeres Fach gefunden wurde.
	 */
	public Regalfach sucheLeeresRegalfach() throws KeinFreiesFach {
		for (int i = 0; i < faecher.size(); i++) {
			if (faecher.get(i).getStatus() == Regalfach.Belegung.FREI) {
				return faecher.get(i);
			}
		}
		throw new KeinFreiesFach();
	}

	/**
	 * Sucht nach einer leeren Warenbox.
	 * 
	 * @return Die Warenbox.
	 * @throws KeineLeereBox
	 *             Wird geworfen wenn keine Warebox gefunden wurde.
	 */
	public Warenbox sucheLeereWarenbox() throws KeineLeereBox {
		Belegung status = Regalfach.Belegung.BELEGT;
		for (int i = 0; i < faecher.size(); i++) {
			if (faecher.get(i).getStatus() == status && faecher.get(i).getWarenbox().istLeer()) {
				return faecher.get(i).getWarenbox();
			}
		}
		throw new KeineLeereBox();
	}

	/**
	 * Sucht nach den Regalfach zur Warenbox.
	 * 
	 * @param warenbox
	 *            Die Warenbox für die das Fach gesucht wird.
	 * @return Das Regalfach oder null fals nicht gefunden.
	 */
	public Regalfach sucheWarenboxRegalfachZuWarenbox(Warenbox warenbox) {
		for (int i = 0; i < faecher.size(); i++) {
			if (faecher.get(i).istBelegt() && faecher.get(i).getWarenbox().equals(warenbox)) {
				return faecher.get(i);
			}
		}
		return null;
	}
}